//
//  ZHUserAccountViewModel.swift
//  ZHWeibo
//
//  Created by user on 15/12/8.
//  Copyright © 2015年 heima. All rights reserved.
//

 /**
   *将controller中请求数据相关的动作,放在这里
   *将模型中,数据归档接档的方法放在这里
   *在这里和networkTool交互,让networkTool提供完整的数据请求过程
*/

import UIKit

class ZHUserAccountViewModel {
    
    //获取归档路径
    ///string和NSString可以直接转-----记得属性不能放置在分类中
    var archivePath: String? = (NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("userAccount.archive")
    //与模型相关的所有的逻辑操作都放置在viewModel中
    //返回当前的token-只读计算属性
    var accessToken: String? {
        //有没有,是否过期
        if let accessToken = userAccount?.access_token {
            return accessToken
        }
        return nil
    }
    //确定是否过期--只读计算属性(true代表过期,false代表未过期)
    var isExpires: Bool {
        //如果不存在,那就按过期处理
        guard let expire = userAccount?.expiresDate else {
            return true
        }
        //存在的话就与当前时间对比
        if NSDate().compare(expire) == NSComparisonResult.OrderedAscending {
            //未过期
            return false
        }
        return true
    }
    //用于判断是否登录-----只读计算属性
    var userIsLogin:Bool {
        return accessToken != nil
    }
    
    //设置model属性
    var userAccount: ZHUserAccount?
    
    //设置全局访问点-----单例
    static let shareAccountInstance: ZHUserAccountViewModel = ZHUserAccountViewModel()
    //构造方法私有化,使得外界不能够通过构造方法初始化对象,而必须使用单例的构造方法
    private init(){
        //从沙盒中加载
        userAccount = loadDataFromshaBox()
    }
}

//对当前对象进行归档和解档
extension ZHUserAccountViewModel{
    /**
      * 分类中不能创建存储属性、计算属性
    */
    //对数据进行归档的方法
    func archiveDataWithModel(account:ZHUserAccount){
        NSKeyedArchiver.archiveRootObject(account, toFile: archivePath!)
    }
    //对数据进行解档
    func loadDataFromshaBox() -> ZHUserAccount? {
        //为什么这种写法会报错
        //let result:ZHUserAccount = (NSKeyedUnarchiver.unarchiveObjectWithFile(archivePath))
        let result = NSKeyedUnarchiver.unarchiveObjectWithFile(archivePath!) as? ZHUserAccount
        return result
    }
}

//获取用户数据后,请求用户信息
extension ZHUserAccountViewModel{
    
    
    
    func getccessToken(code:String, complete:(isSuccess: Bool) -> ()) {
        
        ZHHttpDownLoadTools.shareInstance.getAccessToken(code) { (response, error) -> () in
            
            
            if error != nil {
                complete(isSuccess: false)
                return
            }
            guard let userData = response as? [String: AnyObject] else {
                //返回的数据不是字典
                return
            }
            let account = ZHUserAccount(dict: userData)
            self.userAccount = account
            //加载用户数据
            self.getUserInfo((self.userAccount?.uid)!, accessToken: (self.userAccount?.access_token)!, complete: complete)
        }
        //加载用户数据
        
    }
    
    //请求用户数据
    private func getUserInfo(uid: String, accessToken: String, complete:(isSuccess: Bool) -> ()){
        ZHHttpDownLoadTools.shareInstance.getUserInfo(uid, accessToken: accessToken) { (response, error) -> () in
            if error != nil {
                complete(isSuccess: false)
                return
            }
            //判断返回的数据是不是字典
            guard let dict = response as? [String: AnyObject] else {
                return
            }
            //利用字典赋值
            self.userAccount?.screen_name = dict["screen_name"] as? String
            self.userAccount?.avatar_large = dict["avatar_large"] as? String
            /**
            *  为什么闭包中,必须使用self修饰
            */
            self.archiveDataWithModel(self.userAccount!)
            complete(isSuccess: true)
        }
    }
    
}





























